package com.gitee.huanminabc.fastboot.orm.base;

import com.gitee.huanminabc.jcommon.container.DataPage;
import com.gitee.huanminabc.jlambda_sql.SqlWrapper;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 简要描述
 *
 * @Author: huanmin
 * @Date: 2025/4/5 15:19
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
public interface BaseMapper {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    default <T> boolean insert(T entity) {
        return false;
    }

    default <T> boolean insertBatch(List<T> entityList) {
        return false;
    }

    default <T> boolean insertOrUpdate(T entity) {
        return false;
    }

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    default <T> boolean deleteById(Class<T> tClass, Serializable id) {
        return false;
    }

    /**
     * 根据条件，删除记录
     */
    default <T> boolean delete(SqlWrapper queryWrapper) {
        return false;
    }

    /**
     * 删除（根据ID或实体 批量删除）
     *
     * @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
     */
    default <T> boolean deleteByIds(Class<T> tClass, Collection<?> idList) {
        return false;
    }

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    default <T> boolean updateById(T entity){
        return false;
    }

    /**
     * 根据 whereEntity 条件，更新记录
     * @param updateWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     */
    default <T> boolean update(SqlWrapper updateWrapper){
        return false;
    }

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    default <T> T selectById(Class<T> tClass, Serializable id){
        return null;
    }

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    default <T> List<T> selectByIds(Class<T> tClass, Collection<? extends Serializable> idList){
        return null;
    }


    /**
     * 根据 entity 条件，查询一条记录
     * <p>查询一条记录，例如 qw.last("limit 1") 限制取一条记录, 注意：多条数据会报异常</p>
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    default <T> T selectOne(Class<T> tClass, SqlWrapper queryWrapper){
        return null;
    }


    /**
     * 根据 SqlWrapper 条件，判断是否存在记录
     *
     * @param queryWrapper 实体对象封装操作类
     * @return 是否存在记录
     */
    default <T> boolean exists(SqlWrapper queryWrapper){
        return false;
    }

    /**
     * 根据 SqlWrapper 条件，查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    default <T> long selectCount(SqlWrapper queryWrapper){
        return 0L;
    }

    /**
     * 根据 entity 条件，查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
   default  <T> List<T> selectList(Class<T> tClass, SqlWrapper queryWrapper){
        return null;
   }


    /**
     * 根据 SqlWrapper 条件，查询全部记录
     * @param queryWrapper 实体对象封装操作类
     */
    default <T> List<Map<String, Object>> selectMaps(SqlWrapper queryWrapper){
        return null;
    }
    /**
     * 根据 SqlWrapper 条件，查询一条记录
     * @param queryWrapper 实体对象封装操作类
     */
    default <T> Map<String, Object> selectMap(SqlWrapper queryWrapper){
        return null;
    }


    /**
     * 根据 entity 条件，查询全部记录（并翻页）
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
   default  <P extends DataPage<T>, T> P selectPage(Class<T> tClass, int page, int pageSize, SqlWrapper queryWrapper){
        return null;
   }

    /**
     * 根据 SqlWrapper 条件，查询全部记录（并翻页）
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    default <P extends DataPage<Map<String, Object>>, T> P selectMapsPage(int page, int pageSize, SqlWrapper queryWrapper){
        return null;
    }
}
